/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication2;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.Scanner;

/**
 *
 * @author bartek
 */
public class Kadry implements Serializable {

    Menu menu = new Menu();
    private Pracownik[] pracownicy_;
    private int zatrudnienie_ = 0;
    private Pracownik[] chwilowa;
    public Kadry() {
        pracownicy_ = new Pracownik[100];
        chwilowa = new Pracownik[1];
    }

    public void dodajPracownika(Pracownik e) {
        pracownicy_[zatrudnienie_] = e;
        zatrudnienie_++;
    }

    public void sredniZarobek() {

        int kobiety = 0;
        int mezczyzni = 0;
        float placamen = 0;
        float placawomen = 0;
        for (int i = 0; i < zatrudnienie_; i++) {
            if (pracownicy_[i].getPlec() == 'M') {
                mezczyzni++;
                placamen += pracownicy_[i].getPlaca();
            } else if (pracownicy_[i].getPlec() == 'K') {
                kobiety++;
                placawomen += pracownicy_[i].getPlaca();
            }
        }

        System.out.format("Rożnica między płacą średnią kobiet a mężczyzn wynosi: %.0f %% płacy mężczyzn\n", ((placawomen / kobiety) / (placamen / mezczyzni)) * 100);
    }
    
    public float sredniZarobekWszystkich() {

        
        float placa = 0;
        float placawomen = 0;
        for (int i = 0; i < zatrudnienie_; i++) {
            
                placa += pracownicy_[i].getPlaca();           
        }
        placa/=zatrudnienie_;
        return placa;
    }

    public float sredniZarobek(int dzial) {
        int liczbapracownikow = 0;
        float srednia = 0;
        for (int i = 0; i < zatrudnienie_; i++) {
            if (pracownicy_[i].getDzial() == dzial) {
                liczbapracownikow++;
            }
        }
        for (int i = 0; i < zatrudnienie_; i++) {
            if (pracownicy_[i].getDzial() == dzial) {
                srednia = srednia + (pracownicy_[i].getPlaca() / liczbapracownikow);
            }

        }
        return srednia;
    }

    public int[] dajDzialy() {
        int tab[] = new int[100];
        int liczbadzialow = 0;
        int porownanie;
        for (int i = 0; i < zatrudnienie_; i++) {
            porownanie = 0;
            int dzial = pracownicy_[i].getDzial();
            if (liczbadzialow == 0) {
                tab[liczbadzialow] = dzial;
                liczbadzialow++;
            } else {
                for (int j = 0; j < liczbadzialow; j++) {
                    if (dzial == tab[j]) {
                        porownanie++;
                    }

                }
                if (porownanie == 0) {
                    tab[liczbadzialow] = dzial;
                    liczbadzialow++;
                }

            }
        }
        int tab2[] = new int[liczbadzialow];
        System.arraycopy(tab, 0, tab2, 0, liczbadzialow);

        return tab2;
    }

    public void zapiszDoPliku(String nazwa) throws IOException {
        ObjectOutputStream plik = null;
        try {
            plik = new ObjectOutputStream(new FileOutputStream(nazwa));
            plik.writeObject(this);
            plik.close();
        } catch (IOException e) {
            System.out.println("Blad zapisu pliku obiektowego" + e);
        }
    }

    public static Kadry wczytajZPliku(String nazwa) throws IOException, ClassNotFoundException {
        Kadry z = null;
        ObjectInputStream plik = null;
        try {
            plik = new ObjectInputStream(new FileInputStream(nazwa));
            z = (Kadry) plik.readObject();
            plik.close();
        } catch (Exception e) {
            System.out.println("Blad odczytu pliku obiektowego" + e);
        }
        return z;
    }

    public void importujZPlikuTekstowego(String nazwapliku) throws IOException {

        Scanner in = null;
        BufferedReader plik = null;
        int licznik = 0;
        
        try {
            pracownicy_ = new Pracownik[100];
            zatrudnienie_=0;
            in = new Scanner(new BufferedReader(new FileReader(nazwapliku)));
            while ((in.hasNext())) {
                String imie = in.next();
                String nazwisko = in.next();
                char plec = in.next().charAt(0);
                int nr_dzialu = in.nextInt();
                float placa = in.nextFloat();
                int wiek = in.nextInt();
                boolean stan_cywilny = Boolean.getBoolean(in.next());
                int dzieci = in.nextInt();
                Pracownik prac = new Pracownik(imie, nazwisko, plec, nr_dzialu, placa, wiek, stan_cywilny, dzieci);
                this.dodajPracownika(prac);
                licznik++;
            }
            System.out.format("Wczytano poprawnie dane %d pracowników\n", licznik);
        } finally {
            if (plik != null) {
                plik.close();
                in.close();
            }
        }
    }

    public void danePracownika(int numer) {
        pracownicy_[numer].wypiszPracownika();
    }

    public void danePracownikow() {
        for (int i = 0; i < zatrudnienie_; i++) {
            System.out.print(i + ". ");
            pracownicy_[i].wypiszPracownika();
        }
    }

    public void wypiszPracownikowOkrojona() {
        System.out.format("%-20s %-20s %-10s\n", "Imie", "Nazwisko", "Nr działu");
        
        for (int i = 0; i < zatrudnienie_; i++) {
            pracownicy_[i].wypiszOkrojone();
        }
    }

    public void wypiszPracownikowSpecjalnie() {
        System.out.format("%-20s %-20s %-10s\n", "Imie", "Nazwisko", "Nr działu");
        for (int i = 0; i < zatrudnienie_; i++) {
            pracownicy_[i].wypiszSpecjalnie();
        }
    }

    public void dodajNowegoPracownika() {

        try {
            Scanner in = new Scanner(System.in);
            System.out.println("Podaj imie i nazwisko");
            String imie = in.next();
            String nazwisko = in.next();
            System.out.println("Plec(M lub K)");
            char plec = in.next().charAt(0);
            System.out.println("Nr działu");
            int nr_dzialu = in.nextInt();
            System.out.println("Wynagrodzenie");
            float placa = in.nextFloat();
            System.out.println("Wiek");
            int wiek = in.nextInt();
            System.out.println("Stan cywilny(jeśli żonaty/mężatka wpisz true jeśli nie wpisz false)");
            boolean stan_cywilny = Boolean.getBoolean(in.next());
            System.out.println("Liczba dzieci");
            int dzieci = in.nextInt();
            Pracownik prac = new Pracownik(imie, nazwisko, plec, nr_dzialu, placa, wiek, stan_cywilny, dzieci);
            this.dodajPracownika(prac);
        } catch (Exception e) {
            System.out.println("wprowadzono błedny format danych");
        }

    }

    public void usunPracownika() {
        this.danePracownikow();
        Scanner in = new Scanner(System.in);
        System.out.println("Wprowadź numer pracownika:");
        int numer = in.nextInt();
        for (int i = numer; i < zatrudnienie_ - 1; i++) {
            pracownicy_[i] = pracownicy_[i + 1];
        }
        pracownicy_[zatrudnienie_] = null;
        zatrudnienie_--;
    }

    public void edycjaPracownika() {
        try {
            this.danePracownikow();
            Scanner in = new Scanner(System.in);
            System.out.println("Wprowadź numer pracownika:");
            int numer = in.nextInt();

            pracownicy_[numer].wypiszSpecjalnie();
            int opcja = 1;
            while (opcja != 0) {
                opcja = menu.menuEdycjaPracownika();
                if (opcja == 1) {
                    if (pracownicy_[numer].getPlec() == 'K') {
                        System.out.println("Wprowadź nowe nazwisko");
                        String nazwisko = in.next();
                        pracownicy_[numer].setNazwisko(nazwisko);
                    } else {
                        System.out.println("U Mężczyzn nie wolno zmieniać nazwisk");
                    }
                } else if (opcja == 2) {
                    System.out.println("Wprowadź numer działu");
                    int dzial = in.nextInt();
                    pracownicy_[numer].setDzial(dzial);
                } else if (opcja == 3) {
                    System.out.println("Wprowadź nową płacę");
                    float placa = in.nextFloat();
                    pracownicy_[numer].setPlaca(placa);
                } else if (opcja == 4) {
                    System.out.println("Wprowadź wiek");
                    int wiek = in.nextInt();
                    pracownicy_[numer].setWiek(wiek);
                } else if (opcja == 5) {
                    System.out.println("Wprowadź Stan cywilny(jeśli żonaty/mężatka wpisz true jeśli nie wpisz false) ");
                    String nazwisko = in.next();
                    pracownicy_[numer].setNazwisko(nazwisko);
                } else if (opcja == 6) {
                    System.out.println("Wprowadź liczbę dzieci");
                    int liczba = in.nextInt();
                    pracownicy_[numer].setDzieci(liczba);

                }

            }
        } catch (Exception e) {
            System.out.println("Wprowadźony błędny format danych");
        }

    }

    public int getZatrudnienie() {
        return zatrudnienie_;
    }

    public void mniejszaPensja(float pensja) throws IOException, ClassNotFoundException {

        int licznik = 0;
        for (int i = 0; i < zatrudnienie_; i++) {
            if (pracownicy_[i].getPlaca() < pensja) {
                licznik++;
            }
        }
        System.out.println(licznik);
    }

    public void maksymalnaPlaca() {
        int kobiety = 0;
        int mezczyzni = 0;
        float placa_kobiety = 0;
        float placa_mezczyzni = 0;
        for (int i = 0; i < zatrudnienie_; i++) {
            char plec = pracownicy_[i].getPlec();
            if (plec == 'M') {
                mezczyzni++;
                placa_mezczyzni += pracownicy_[i].getPlaca();
            } else if (plec == 'K') {
                kobiety++;
                placa_kobiety += pracownicy_[i].getPlaca();

            }

        }

        System.out.format("Największa płaca kobiety:%s mezczyzni:%s\n", placa_kobiety / kobiety, placa_mezczyzni / mezczyzni);
    }

    public String porownaniePlci(int dzial) {
        String porownanie = "";
        int kobiety = 0;
        int mezczyzni = 0;
        for (int i = 0; i < zatrudnienie_; i++) {
            if (pracownicy_[i].getDzial() == dzial) {
                if (pracownicy_[i].getPlec() == 'M') {
                    mezczyzni++;
                } else if (pracownicy_[i].getPlec() == 'K') {
                    kobiety++;
                }
            }
        }
        if (kobiety > mezczyzni) {
            porownanie = "Wiecej jest kobiet";
        } else if (kobiety < mezczyzni) {
            porownanie = "Wiecej jest mężczyzn";
        } else if (kobiety == mezczyzni) {
            porownanie = "mezczyzn i kobiet jest tyle samo";
        }
        return porownanie;
    }

    public void podniesPensje() {
        for (int i = 0; i < zatrudnienie_; i++) {

            float podwyzka = 1;
            if (pracownicy_[i].getStanCywilny() == true) {
                podwyzka += 0.1 + (pracownicy_[i].getDzieci() * 0.02) + 0.03;
            } else {
                podwyzka += 0.1 + (pracownicy_[i].getDzieci() * 0.02);
            }

            pracownicy_[i].setPlaca(pracownicy_[i].getPlaca() * podwyzka);
        }
    }

    public float podwyzkaZPorownaniem(float podwyzka) {
        float wynagrodzenie;
        float kobiety = 0;
        float mezczyzni = 0;
        for (int i = 0; i < zatrudnienie_; i++) {

            if (pracownicy_[i].getPlec() == 'M') {
                mezczyzni++;

            } else if (pracownicy_[i].getPlec() == 'K') {
                kobiety++;
            }
            wynagrodzenie = podwyzka + pracownicy_[i].getPlaca();
            pracownicy_[i].setPlaca(wynagrodzenie);
        }
        System.out.format("Suma podwyżki wynosi: %.2f\n", (kobiety + mezczyzni) * podwyzka);
        float roznica = ((kobiety / mezczyzni)) * 100;

        return roznica;

    }

    public void eksportDoPlikuTekstowego(String nazwa) throws IOException {
        PrintWriter out = null;
        try {
            out = new PrintWriter(new FileWriter(nazwa), true);
            for (int i = 0; i < zatrudnienie_; i++) {
                out.format("%s %s %s %s %.2f %s %s %s", pracownicy_[i].getImie(), pracownicy_[i].getNazwisko(), pracownicy_[i].getPlec(), pracownicy_[i].getDzial(),pracownicy_[i].getPlaca(), pracownicy_[i].getWiek(), pracownicy_[i].getStanCywilny(), pracownicy_[i].getDzieci());
                out.println();
            }

        } finally {
            out.close();
        }
    }
    
    public void tabelaHTML() throws IOException, ClassNotFoundException{
        PrintWriter out = null;
        
        
        try {
            out = new PrintWriter(new FileWriter("pracownicy.html"), true);
            out.println("<HTML><HEAD>Pracownicy</HEAD><BODY><table>");
            out.println("<tr><td>Nazwisko</td><td>Imie</td><td>Płeć</td><td>Numer działu</td><td>Płaca</td><td>Wiek</td><td>Stan cywilny</td><td>Liczba dzieci</td></tr>");
            for (int i = 0; i < zatrudnienie_; i++) {
                String stan = "wolny";
                if (pracownicy_[i].getStanCywilny() == true && pracownicy_[i].getPlec() == 'M') {
            stan = "mężaty";
        } else if (pracownicy_[i].getStanCywilny() == true && pracownicy_[i].getPlec() == 'K') {
            stan = "żonata";
        }
                out.format("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",  pracownicy_[i].getNazwisko(),pracownicy_[i].getImie(), pracownicy_[i].getPlec(), pracownicy_[i].getDzial(), pracownicy_[i].getPlaca(), pracownicy_[i].getWiek(), stan, pracownicy_[i].getDzieci());
            }
            out.println("</table></BODY></HTML>"); 
            
        } finally {
            out.close();
        }
    }
    
    
    public void Kodowanie(){
        for(int i = 0;i<zatrudnienie_;i++){
            float srednizarobek = this.sredniZarobekWszystkich();
            if(pracownicy_[i].getPlaca()<srednizarobek){
                String nazwisko="";
                nazwisko+=pracownicy_[i].getNazwisko().charAt(0);
                for(int j=1;j<pracownicy_[i].getNazwisko().length();j++){
                    nazwisko+="*";
                }
                pracownicy_[i].setNazwisko(nazwisko);
            }
        }
    }
    
    public void sredniWiekOsobZDziecmi(){
        double sredniwiek=0;
        int liczba=0;
        for(int i = 0;i<zatrudnienie_;i++){
            if(pracownicy_[i].getDzieci()>0){
                liczba++;
                sredniwiek+=pracownicy_[i].getWiek();
            }
        }
        sredniwiek/=liczba;
        System.out.println("Średni wiek pracowników z dziećmi : "+sredniwiek);
    }
    
    public void  najdluzszeNazwiska(String nazwapliku) throws IOException{
        int dlugoscnazwiska=0;
        for(int i = 0;i<zatrudnienie_;i++){
            if(pracownicy_[i].getNazwisko().length()>dlugoscnazwiska){
                dlugoscnazwiska=pracownicy_[i].getNazwisko().length();
            }
        }
        System.out.println("Osoby z najdłuższym nazwiskiem");
        for(int i = 0;i<zatrudnienie_;i++){
            if(pracownicy_[i].getNazwisko().length()==dlugoscnazwiska){
                
                this.importujZPlikuTekstowegoOkreslonego(nazwapliku, i);
            }
        }
    }
    public void importujZPlikuTekstowegoOkreslonego(String nazwapliku,int linia) throws IOException {

        Scanner in = null;
        BufferedReader plik = null;
        int licznik = 0;
        
        try {
            
            in = new Scanner(new BufferedReader(new FileReader(nazwapliku)));
            while ((in.hasNextLine())) {              
                licznik++;
                String pracownik=in.nextLine();
                if(licznik==linia+1){                   
                    System.out.println(pracownik);
                    break;
                }
            }
            
        } finally {
            if (plik != null) {
                plik.close();
                in.close();
            }
        }
    }
    
    public void zamienMiejscami(int i,int j){
        chwilowa[0]=pracownicy_[i];
        pracownicy_[i]=pracownicy_[j];
        pracownicy_[j]=chwilowa[0];
    }
    
    public void sortowanieNazwisko(boolean tryb){
        if(tryb==true){
          for(int i = 0;i<zatrudnienie_-1;i++){
            if(pracownicy_[i].getNazwisko().compareTo(pracownicy_[i+1].getNazwisko())>0){
                this.zamienMiejscami(i, i+1);
                while(i>0){
                    if(pracownicy_[i].getNazwisko().compareTo(pracownicy_[i-1].getNazwisko())<0){
                        this.zamienMiejscami(i, i-1);
                        i--;
                    }else{
                        break;
                    }
                }
            }
        }  
        }else if(tryb==false){
           for(int i = 0;i<zatrudnienie_-1;i++){
            if(pracownicy_[i].getNazwisko().compareTo(pracownicy_[i+1].getNazwisko())<0){
                this.zamienMiejscami(i, i+1);
                while(i>0){
                    if(pracownicy_[i].getNazwisko().compareTo(pracownicy_[i-1].getNazwisko())>0){
                        this.zamienMiejscami(i, i-1);
                        i--;
                    }else{
                        break;
                    }
                }
            } 
        }
        
        }
    }
    public void sortowaniePensja(boolean tryb){
        if(tryb==true){
        for(int i = 0;i<zatrudnienie_-1;i++){
            if(pracownicy_[i].getPlaca()>pracownicy_[i+1].getPlaca()){
                this.zamienMiejscami(i, i+1);
                while(i>0){
                    if(pracownicy_[i].getPlaca()<pracownicy_[i-1].getPlaca()){
                        this.zamienMiejscami(i, i-1);
                        i--;
                    }else{
                        break;
                    }
                }
            }
        }    
        }else if(tryb==false){
         for(int i = 0;i<zatrudnienie_-1;i++){
            if(pracownicy_[i].getPlaca()<pracownicy_[i+1].getPlaca()){
                this.zamienMiejscami(i, i+1);
                while(i>0){
                    if(pracownicy_[i].getPlaca()>pracownicy_[i-1].getPlaca()){
                        this.zamienMiejscami(i, i-1);
                        i--;
                    }else{
                        break;
                    }
                }
            }
        }   
        }
        
    }
    
    
}
